import pymysql
import pytest
from utils.database import DataBase
from config.config import *
import os
from utils.config_parser import GetConfig
from utils.data_preprocessor import dddd_ocr_text


@pytest.fixture(scope="session", autouse=True)
def destroy_data():
    yield

    DataBase().execute_sql(SQL1, SQL2)

    # sqls = [SQL1, SQL2]
    #
    # conn = pymysql.Connect(
    #     host=DB_HOST,
    #     port=DB_PORT,
    #     user=DB_USER,
    #     passwd=DB_PASSWORD,
    #     database=DB_NAME,
    #     charset=CHARSET,
    #     autocommit=AUTOCOMMIT
    # )
    #
    # # 创建游标
    # cur = conn.cursor()
    # # 执行语句
    # for sql in sqls:
    #     cur.execute(sql)
    # # 关闭游标
    # cur.close()
    # # 断开连接
    # conn.close()


# 设置环境变量
def pytest_configure(config):
    env = config.getoption("--env")  # 获取参数传进来的值

    os.environ["ENV"] = env
    cfg = GetConfig()

    # 根据传进来的不同参数读取配置文件，这只不同的环境变量
    if env == "test":
        os.environ["URL"] = cfg.get_base_url("test_base_url")
        os.environ["DATABASE"] = str(cfg.get_database_data("test_database"))
    elif env == "sting":
        os.environ["URL"] = cfg.get_base_url("sting_base_url")
        os.environ["DATABASE"] = str(cfg.get_database_data("sting_database"))
    elif env == "prod":
        os.environ["URL"] = cfg.get_base_url("prod_base_url")
        os.environ["DATABASE"] = str(cfg.get_database_data("prod_database"))

    # 设置基础的mock_url
    os.environ["MOCK_URL"] = cfg.get_base_url("mock_url")



    # # 在用例执行之前获取sn和验证码，存为环境变量
    # sn, text = dddd_ocr_text()
    # os.environ["SN"] = sn
    # os.environ["TEXT"] = text


def pytest_addoption(parser):
    parser.addoption(
        "--env",
        action="store",
        default="test",
        help="运行时的环境配置参数(test, sting, prod)"
    )


def pytest_collection_modifyitems(config, items):
    """

    :param config: pytest的配置信息，命令行参数
    :param items: 测试用例的列表，每个元素都是pytest.item对象，表示一个具体的测试用例
    :return:
    """
    for item in items:
        case = item.callspec.params.get("case", {})
        # 判断is_true为False的时候跳过测试
        if not case.get("is_true"):
            case = item.callspec.params.get("case", {})
            item.add_marker(pytest.mark.skip(reason="标记为跳过测试"))

        # 判断失败重试的次数大于0的时候进行重试
        if case.get("reruns") > 0:
            item.add_marker(pytest.mark.flaky(reruns=case.get("reruns")))
